Disk based operating systems divide a disk into physical sectors which represent the fundamental units for data storage on the disk. A sector is a portion of the circumference of a track on the disk, and each sector is represented logically as a data storage "block". Since a block represents the minimum logical storage unit for a disk, reading and writing data to a disk involves the use of entire blocks. In general purpose disk file systems, block sizes are usually selected to be small (e.g., 512 bytes/block), in order to minimize the waste of disk space in blocks that are only partially filled with data. Such file systems also attempt to allocate the small blocks in sequential order on the disk, so that large reads and writes to the disk can be performed efficiently. However, as files are created, modified, or deleted, the free space on the disk can quickly become fragmented so that new files are not allocated blocks which are sequential on the disk. One method of reducing file fragmentation is to increase the block size to accommodate larger files.
The use of large block sizes, however, may introduce limitations which affect the disk access performance of the file system. Large block sizes increase the latency for disk transfers since a single read or write operation involves more data during a single operation. If each block is filled with data, single read or write operations may actually increase disk transfer efficiency, since seek times are reduced. If, however, the blocks are not entirely filled with data or are filled with data which is to be accessed more than once by an application program, disk access cycles are wasted during read operations since entire blocks of disk space need to be read, or re-read, from disk into memory in order to access the data. For blocks which contain a small amount of data in relation to the size of the block, data transfer latency can therefore be substantially increased.
It is therefore an intended advantage of the present invention to provide a system for sub-allocating disk space within larger blocks so that data transfer operations are performed only on sections of blocks which contain data which has not previously been read into memory from the disk.